package cn.bookcycle.panda.pay.controller;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;

import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import cn.bookcycle.panda.pay.constant.BusinessData;
import cn.bookcycle.panda.pay.constant.NameData;
import cn.bookcycle.panda.pay.util.DaoUtil;
import cn.bookcycle.panda.pay.util.DataDeal;
import cn.bookcycle.panda.pay.util.DataFormatConvert;
import cn.bookcycle.panda.pay.util.Request;
import cn.bookcycle.panda.pay.util.ServiceRequest;
import cn.bookcycle.panda.pay.util.ServiceResponse;

/**
 *	接收支付请求Controller
 *
 * @author liufenglin
 * @date 2018年1月27日  
 */
@Controller
public class RequestController {
	private static final Logger logger = LoggerFactory.getLogger(RequestController.class);
	
	@ResponseBody
	@RequestMapping(value = "pay", method = RequestMethod.POST)
	public String resolveRequest(@RequestBody (required=false) String requestBody) {
		// 默认返回失败的json串
		String returnJson = BusinessData.DEFAULT_STATUS;
		if (requestBody != null) {
			try {
				// 对接收到的数据进行URL解码
				requestBody = URLDecoder.decode(requestBody, "UTF-8");
				logger.info("请求接收到的数据是：{}", requestBody);
			} catch (UnsupportedEncodingException e) {
				// 打印日志信息
				logger.warn("请求支付微服务的数据不全！");
			}
			// 对json数据进行格式清洗，以保证是标准的json数据
			requestBody = DataFormatConvert.washJson(requestBody);
			// 对json串进行参数解析，生成必须参数Map和可选参数Map
			Map<String, Map<String, Object>> parametersMap;
			try {
				parametersMap = ServiceRequest.getJsonParamaters(requestBody);
				
			} catch (JSONException e) {
				// 如果出现异常，就new HashMap，防止接下来使用出现空指针异常
				parametersMap = new HashMap<String, Map<String, Object>>();
				logger.error("解析发过来的JSON数据出现异常！！！！");
			}
			// 把所有参数记录到数据库
			DaoUtil.logParameters(parametersMap);
			// 把必须参数的map，用来向微信支付接口发送请求，发送数据是XML格式，函数返回的数据也是XML格式
			String xmlResult = ServiceRequest.requestWechatPay(parametersMap.get(NameData.NECESSARY_PARAMETERS));
			// 处理请求微信支付接口后的返回结果，接收数据是XML格式,处理后的数据是json格式
			returnJson = DataFormatConvert.xmlToJson(xmlResult);
			// 把微信返回过来的数据，处理为微服务规定的数据(带上订单号)，再返回给用户
			String tradeNo = parametersMap.get(NameData.NECESSARY_PARAMETERS).get(BusinessData.NECESSARY_PARAMETERS_MAP.get(NameData.TRADE_NO)).toString();
			returnJson = DataDeal.dealReturnJson(returnJson, tradeNo);
		} else {
			// 不进行任何处理，直接把初始化的returnJson串返回给请求者
		}
		// 把上一步处理后的结果以json数据形式返回给微服务的调用者
		return returnJson;
	}
}
